import java.util.*;

public class Main {

    //连连看

//    static int n,m;
    static int [][]arr;
    public static long Getans(int x,int y){
        long res=0;
        int []f=new int[1005];
        while(x<=n&&y<=m){
            if(f[arr[x][y]]==0){
                f[arr[x][y]]++;
            }else{
                res+=f[arr[x][y]]*2;
                f[arr[x][y]]++;
            }
            x++;
            y++;
        }
        return res;
    }
    public static long Getans1(int x,int y){
        long res=0;
        int []f=new int[1005];
        while(x<=n&&y>=1){
            if(f[arr[x][y]]==0){
                f[arr[x][y]]++;
            }else{
                res+=f[arr[x][y]]*2;
                f[arr[x][y]]++;
            }
            x++;
            y--;
        }
        return res;
    }

    public static void main1(String[] args) {
        Scanner sc = new Scanner(System.in);
        //在此输入您的代码...
        n=sc.nextInt();
        m=sc.nextInt();
        arr=new int[n+1][m+1];
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                arr[i][j]=sc.nextInt();
            }
        }
        long res=0;
        for(int i=1;i<=n;i++){//求与主对角线平行的45°斜边
            for(int j=1;j<=m;j++){
                if(i>1&&j>1){
                    continue;
                }
                res+=Getans(i,j);
            }
        }
        for(int i=1;i<=n;i++){//求与反对角线平行的45°斜边
            for(int j=1;j<=m;j++){
                if(i>1&&j<n){
                    continue;
                }
                res+=Getans1(i,j);
            }
        }
        System.out.println(res);
        sc.close();
    }


    //方法二:
    //试着把一个斜线的所有数字个数存下来
    //同一个斜线相同数的个数假设是n,他对答案的贡献就是n个里面任意选两个，也就是C(n,2)=(n-1)*(n-2)/2
    public static int count=0;

    public static void main2(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();
        Map<Integer, ArrayList<int[]>> map=new HashMap<>();
        for(int i=0;i<n;i++) {
            for(int j=0;j<m;j++) {
                int val=sc.nextInt();
                if(map.containsKey(val)) {
                    map.get(val).add(new int[] {i,j});
                }else {
                    ArrayList<int[]> list=new ArrayList<>();
                    list.add(new int[]{i,j});
                    map.put(val,list);
                }
            }
        }

        for(int val:map.keySet()) {
            ArrayList<int[]> now=map.get(val);
            if(now.size()<2) {
                continue;
            }
            for(int i=0;i<now.size();i++) {
                int[] l=now.get(i);
                int a=l[0];
                int b=l[1];
                for(int j=i+1;j<now.size();j++) {
                    int[] r=now.get(j);
                    int c=r[0];
                    int d=r[1];
                    if(Math.abs(a-c)>0&&Math.abs(a-c)==Math.abs(b-d)) {
                        count++;
                    }
                }
            }
        }

        System.out.println(count*2);
        sc.close();
    }


    //由题中式子 |a - c| = | b - d| > 0 分析得
    //只要是在同一条对角线上的元素的坐标都可以
    //所以可以统计每一个对角线上的元素，若有 i 组 2 个相同的元素，则cnt + i*2

    //枚举每一条对角线
    //统计对角线上元素个数的值

    public static int[][] a = new int[1003][1003];
    public static int n;
    public static int m;
    public static long ans;

    //主对角线
    public static long get_p(int x,int y){
        //每次向右下45度进行
        long res = 0;
        // key 代表值，val 代表出现次数
        Map<Integer,Integer> map = new HashMap<>();
        while(x <= n && y <= m){
            res += map.getOrDefault(a[x][y],0);
            map.put(a[x][y],map.getOrDefault(a[x][y],0) + 1);
            x++;
            y++;
        }
        return res * 2;
    }


    //反对角线

    public static long get_rp(int x,int y){
        // x :行 ，y :列
        //每次向左下45度进行
        long res = 0;
        Map<Integer,Integer> map = new HashMap<>();
        while(x <= n && y <= m){
            res += map.getOrDefault(a[x][y],0);
            map.put(a[x][y],map.getOrDefault(a[x][y],0) + 1);
            x++;
            y--;
        }
        return res * 2;
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();
        m = scan.nextInt();
        //编辑矩阵
        for(int i = 1; i <= n; i++){
            for(int j = 1 ; j <= m; j++){
                a[i][j] = scan.nextInt();
            }
        }
        //枚举每一根对角线
        //主对角线
        ans = 0;
        for(int i = 1; i < m; i++){
            ans += get_p(1,i);
        }
        for(int i = 2; i < n; i++){
            ans += get_p(i,1);
        }

        //反对角线
        for(int i = 2; i <= m; i++){
            ans += get_rp(1,i);
        }
        for(int i = 2; i < n; i++){
            ans += get_rp(i,m);
        }
        System.out.println(ans);
        scan.close();
    }

}

